// 1. 创建一个新的axios实例
// 2. 请求拦截器，如果有token进行头部携带
// 3. 响应拦截器：1. 剥离无效数据  2. 处理token失效
// 4. 导出一个函数，调用当前的axsio实例发请求，返回值promise

import axios from 'axios'
import store from '@/store/index.js'
import router from '@/router/index.js'

// 导出基准地址,其他地方不是通过axios发送地址时用到基地址
export const baseURL = 'http://pcapi-xiaotuxian-front-devtest.itheima.net/'
// 创建axios副本
const _axios = axios.create({
  baseURL,
  timeout: 5000
})
// 请求拦截
_axios.interceptors.request.use(
  (config) => {
    // 导入vuex储存的用户信息
    const { profile } = store.state.user
    // 判断是否有token
    if (!profile.token) {
      config.headers.Authorization = `Bearer ${profile.token}`
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)
// 响应拦截
_axios.interceptors.response.use(
  (res) => {
    return res.data
  },
  (error) => {
    // 401状态码  token过期/登录失效/没登录
    if (error.response && error.response.status === 401) {
      // 1. 清空无效用户信息 2.跳转登录页 3.回调/带参数
      store.commit('user/setUser', {})
      // js模块中：router.currentRoute.value.fullPath 就是当前路由地址，router.currentRoute 是ref响应式数据
      // encodeURIComponent 加密=>uri编码
      const fullPath = encodeURIComponent(router.currentRoute.value.fullPath)
      router.push('/login?redirectUrl=' + fullPath)
    }
    return Promise.reject(error)
  }
)

// 请求工具函数(封装axios请求函数)
export default (url, method, submitData) => {
  // 请求地址,请求方式,提交的数据
  return _axios({
    url,
    method,
    // get请求  => submitData === params
    // 其他请求 =>   submitData === data
    [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData
  })
}
